/**
 * $Revision$
 * $Date$
 *
 * Copyright 2003-2007 Jive Software.
 *
 * All rights reserved. Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.jivesoftware.smackx.workgroup.ext.macros;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

/**
 * MacroGroup datamodel.
 */
public class MacroGroup {
	private List<Macro> macros;
	private List<MacroGroup> macroGroups;

	// Define MacroGroup
	private String title;

	public MacroGroup() {
		macros = new ArrayList<Macro>();
		macroGroups = new ArrayList<MacroGroup>();
	}

	public void addMacro(Macro macro) {
		macros.add(macro);
	}

	public void removeMacro(Macro macro) {
		macros.remove(macro);
	}

	public Macro getMacroByTitle(String title) {
		Collection<Macro> col = Collections.unmodifiableList(macros);
		Iterator<Macro> iter = col.iterator();
		while (iter.hasNext()) {
			Macro macro = (Macro) iter.next();
			if (macro.getTitle().equalsIgnoreCase(title)) {
				return macro;
			}
		}
		return null;
	}

	public void addMacroGroup(MacroGroup group) {
		macroGroups.add(group);
	}

	public void removeMacroGroup(MacroGroup group) {
		macroGroups.remove(group);
	}

	public Macro getMacro(int location) {
		return (Macro) macros.get(location);
	}

	public MacroGroup getMacroGroupByTitle(String title) {
		Collection<MacroGroup> col = Collections.unmodifiableList(macroGroups);
		Iterator<MacroGroup> iter = col.iterator();
		while (iter.hasNext()) {
			MacroGroup group = (MacroGroup) iter.next();
			if (group.getTitle().equalsIgnoreCase(title)) {
				return group;
			}
		}
		return null;
	}

	public MacroGroup getMacroGroup(int location) {
		return (MacroGroup) macroGroups.get(location);
	}

	public List<Macro> getMacros() {
		return macros;
	}

	public void setMacros(List<Macro> macros) {
		this.macros = macros;
	}

	public List<MacroGroup> getMacroGroups() {
		return macroGroups;
	}

	public void setMacroGroups(List<MacroGroup> macroGroups) {
		this.macroGroups = macroGroups;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String toXML() {
		StringBuilder buf = new StringBuilder();
		buf.append("<macrogroup>");
		buf.append("<title>" + getTitle() + "</title>");
		buf.append("<macros>");
		for (Macro macro : getMacros()) {
			buf.append("<macro>");
			buf.append("<title>" + macro.getTitle() + "</title>");
			buf.append("<type>" + macro.getType() + "</type>");
			buf.append("<description>" + macro.getDescription()
					+ "</description>");
			buf.append("<response>" + macro.getResponse() + "</response>");
			buf.append("</macro>");
		}
		buf.append("</macros>");

		if (getMacroGroups().size() > 0) {
			buf.append("<macroGroups>");
			for (MacroGroup groups : getMacroGroups()) {
				buf.append(groups.toXML());
			}
			buf.append("</macroGroups>");
		}
		buf.append("</macrogroup>");
		return buf.toString();
	}
}
